package com.uchiha.nova.mainService.listener;


import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.springframework.data.redis.connection.Message;
import org.springframework.data.redis.connection.MessageListener;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;

import java.io.UnsupportedEncodingException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * redis订阅方:接收消息
 * <p>
 * 为了接收 Redis 渠道发送过来的消息，我们先定义一个消息监听器（ MessageListener ）
 *
 * @author csf
 * @data 2020/10/27
 */
@Component
@Slf4j
public class MyRedisSubscribeListener implements MessageListener {
    /**
     * 这里的 onMessage 方法是得到消息后的处理方法， 其中 message 参数代表 Redis 发送过来的消息，
     * pattern是渠道名称，onMessage方法里打印 了它们的内容。这里因为标注了 ＠Component 注解，所以
     * 在 Spring Boot 扫描后，会把它自动装配到 IoC 容器中 ,监听着对象RedisMessageListener会自动
     * 将消息进行转换。
     *
     * @param message
     * @param bytes
     */

    public static Map<String, List<String>> roles = new HashMap<>();
    public static Map<String, String> clients = new HashMap<>();
    public static String tokenKey = "";

    @Resource
    RedisTemplate<String, Object> redisTemplate;

    @Override
    public void onMessage(Message message, byte[] bytes) {
        log.info("onMessage:{}", message);
        //消息体
        String body = null;
        try {
            //解决string乱码
            body = new String(message.getBody(), "utf-8");

        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
        //渠道名称
        String key = body.replace("\"", "");
        String topic = new String(bytes);
        log.info("onMessage-key:{}", key);
        log.info("onMessage-topic:{}", topic);
        if ("client".equals(key)) {
            clients = (Map<String, String>) redisTemplate.opsForValue().get("nova:client");
        } else {
            List<String> roleList = (List<String>) redisTemplate.opsForValue().get(topic + key);
            roles.put(key, roleList);
        }

        tokenKey = (String) redisTemplate.opsForValue().get("nova:oauth:token-key");
    }

    public static Map<String, List<String>> getRoles() {
        return roles;
    }
    public static Map<String, String> getClients() {
        return clients;
    }
    public static void setClients(Map<String, String> clients) {
        MyRedisSubscribeListener.clients = clients;
    }
    public static String getTokenKey() {
        return tokenKey;
    }

}
